﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//Unsings adicionales 
using System.Data;
using ICE.Vacations.Datos;
using ICE.Vacations.Datos.FileManager;
using ICE.Vacations.Entidades;
using Oracle.DataAccess.Client;


namespace ICE.Vacations.Datos.Oracle_Manager
{
    public static class OracleDataClass
    {
        public static OracleConnection oracleConnection;

        public static void OpenConnection()
        {
            try
            {
                oracleConnection = new OracleConnection();
                Logger.fileWrite("Tratando de conectar al servidor [" + Config.RRHH_DataBase + "]...", Logger.MessageType.Information);



                oracleConnection.ConnectionString = "Data Source=" + Config.RRHH_DataBase + ";User Id=" + Config.RRHH_User + ";Password=" + Config.RRHH_Password + ";";
                
                
                
               // User Id=" + Config.RRHH_User + "; Password=" + Config.RRHH_Password + "; Server=" + Config.RRHH_DataBase + ";";
                Logger.fileWrite("string de Conexion [" + oracleConnection.ConnectionString + "]...", Logger.MessageType.Information);

                oracleConnection.Open();
                Logger.fileWrite("Conexión abierta con el servidor [" + Config.RRHH_DataBase + "]...", Logger.MessageType.Information);
            }
            catch (OracleException oracleExc)
            {
                Logger.fileWrite("Error de ORACLE [" + oracleExc.Message + "]...", Logger.MessageType.Information);

                throw (oracleExc);
            }
        }

        public static void CloseConnection()
        {
            try
            {
                oracleConnection.Close();
                oracleConnection.Dispose();
            }
            catch (OracleException oracleExc)
            {
                throw (oracleExc);
            }
        }

        //get periodos
        public static String[] getCodes(String cedula)
        {

            OpenConnection();
            OracleCommand oracleCommand = new OracleCommand();
            oracleCommand.Connection = oracleConnection;

            oracleCommand.CommandType = CommandType.Text;
            oracleCommand.CommandText = "SELECT COD_DIRECCION,NOM_DIRECCION " +
            "FROM " +Entidades.Config.RRHH_View + " WHERE CEDULA = " + cedula;


            OracleDataReader reader = oracleCommand.ExecuteReader();
            if (reader.HasRows)
            {
              reader.Read();
                String [] vacaciones=new String[2];
                    try
                    {
                        vacaciones[0]= reader.GetOracleValue(reader.GetOrdinal("COD_DIRECCION")).ToString();
                    }
                    catch
                    {
                        vacaciones[0] = "";
                    }

                    vacaciones[1] = reader.GetOracleValue(reader.GetOrdinal("NOM_DIRECCION")).ToString();
                    if (vacaciones[1].ToUpper().Equals("NULL"))
                        vacaciones[1] = "";


                return vacaciones;
            }
            else
            {
                CloseConnection();
                return new String[2];
            }



        } 
        
        //get periodos
        public static List<Vista_Oracle> getVistaEmpleados(String cedula)
        {
            
                OpenConnection();
                OracleCommand oracleCommand = new OracleCommand();
                oracleCommand.Connection = oracleConnection;

                oracleCommand.CommandType = CommandType.Text;                
                oracleCommand.CommandText = "SELECT CEDULA,NOMBRE,COD_DIRECCION,NOM_DIRECCION,"+
                "COD_CF,FECHA_INGRESO,PERIODO,DIAS_PERIODO,DIAS_COMPENSADOS,DIAS_DISFRUTADOS,"+
                "DIAS_INCAPACIDAD,DIAS_PROPORCIONALES,DIAS_DISPONIBLES "+                
                "FROM "+ Entidades.Config.RRHH_View +" WHERE CEDULA = " + cedula;
                

               OracleDataReader reader= oracleCommand.ExecuteReader();
               if (reader.HasRows)
               {
                   List<Vista_Oracle> lista = new List<Vista_Oracle>();
                   while(reader.Read()){
                       Vista_Oracle vacaciones = new Vista_Oracle();
                       try{
                        vacaciones.cedula=Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("CEDULA")).ToString());
                       }catch (Exception exc){
                           //Logger.fileWrite("Error CEDULA:" + exc.Message, Logger.MessageType.Error);
                            vacaciones.cedula=0;
                       }

                        vacaciones.nombre=reader.GetOracleValue(reader.GetOrdinal("NOMBRE")).ToString();
                        if(vacaciones.nombre.ToUpper().Equals("NULL"))
                            vacaciones.nombre="";

                       try{
                           vacaciones.cod_direccion = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("COD_DIRECCION")).ToString());
                       }
                       catch (Exception exc)
                       {
                           Logger.fileWrite("Error COD_DIRECCION:" + exc.Message, Logger.MessageType.Error);
                           vacaciones.cod_direccion = 0;
                       }

                       try
                       {
                           vacaciones.nom_direccion = reader.GetOracleValue(reader.GetOrdinal("NOM_DIRECCION")).ToString();
                           if (vacaciones.nom_direccion.ToUpper().Equals("NULL"))
                               vacaciones.nom_direccion = "";
                       }
                       catch (Exception exc)
                       {
                           //Logger.fileWrite("Error NOM_DIRECCION:" + exc.Message, Logger.MessageType.Error);
                           vacaciones.nom_direccion = "";
                       }
              
                        try{
                            vacaciones.cod_cf = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("COD_CF")).ToString());
                        }
                        catch (Exception exc)
                        {
                            Logger.fileWrite("Error NOM_DIRECCION:" + exc.Message, Logger.MessageType.Error);

                            vacaciones.cod_cf=0;
                       }

                       //vacaciones.nom_cf=reader.GetOracleValue(reader.GetOrdinal("NOM_CF")).ToString();
                       // if(vacaciones.nom_cf.ToUpper().Equals("NULL"))
                       //     vacaciones.nom_cf="";
                        try
                        {
                            vacaciones.fecha_ingreso = reader.GetOracleValue(reader.GetOrdinal("FECHA_INGRESO")).ToString();
                            if (vacaciones.fecha_ingreso.ToUpper().Equals("NULL"))
                                vacaciones.fecha_ingreso = "";
                        }
                        catch (Exception exc)
                        {
                            //Logger.fileWrite("Error FECHA_INGRESO:" + exc.Message, Logger.MessageType.Error);

                            vacaciones.fecha_ingreso = "";
                        }
                       try{
                           vacaciones.periodo = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("PERIODO")).ToString());
                       }
                       catch (Exception exc)
                       {
                           //Logger.fileWrite("Error PERIODO:" + exc.Message, Logger.MessageType.Error);
                            vacaciones.periodo=0;
                       }
                      
                         try{
                             vacaciones.dias_periodo = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_PERIODO")).ToString());
                         }
                         catch (Exception exc)
                         {
                             //Logger.fileWrite("Error DIAS_PERIODO:" + exc.Message, Logger.MessageType.Error);

                            vacaciones.dias_periodo=0;
                       }

                         try{
                             vacaciones.dias_compensados = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_COMPESADOS")).ToString());
                         }
                         catch (Exception exc)
                         {
                             //Logger.fileWrite("Error DIAS_COMPENSADOS:" + exc.Message, Logger.MessageType.Error);

                            vacaciones.dias_compensados=0;
                       }

                       try{
                           vacaciones.dias_disfrutados = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_DISFRUTADOS")).ToString());
                       }
                       catch (Exception exc)
                       {
                           Logger.fileWrite("Error DIAS_DISFRUTADOS:" + exc.Message, Logger.MessageType.Error);

                            vacaciones.dias_disfrutados=0;
                       }

                       try{
                           vacaciones.dias_incapacidad = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_INCAPACIDAD")).ToString());
                       }
                       catch (Exception exc)
                       {
                           //Logger.fileWrite("Error DIAS_INCAPACIDAD:" + exc.Message, Logger.MessageType.Error);

                            vacaciones.dias_incapacidad=0;
                       }

                        try{
                            vacaciones.dias_proporcionales = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_PROPORCIONALES")).ToString());
                        }
                        catch (Exception exc)
                        {
                            //Logger.fileWrite("Error DIAS_PROPORCIONALES:" + exc.Message, Logger.MessageType.Error);

                            vacaciones.dias_proporcionales=0;
                       }
                       

                         try{
                             vacaciones.dias_disponibles = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_DISPONIBLES")).ToString());
                         }
                         catch (Exception exc)
                         {
                             //Logger.fileWrite("Error DIAS_DISPONIBLES:" + exc.Message, Logger.MessageType.Error);

                            vacaciones.dias_disponibles=0;
                       }
                               
                       lista.Add(vacaciones);
                   }
                   return lista;
               }
               else
               {
                   CloseConnection();
                   return new List<Vista_Oracle>();
               }


          
        }

        public static List<Vista_Oracle> getVistaEmpleados(string campo, string valor)
        {

            OpenConnection();
            OracleCommand oracleCommand = new OracleCommand();
            oracleCommand.Connection = oracleConnection;

            oracleCommand.CommandType = CommandType.Text;
            oracleCommand.CommandText = "SELECT CEDULA,NOMBRE,COD_DIRECCION,NOM_DIRECCION," +
            "COD_CF,FECHA_INGRESO,PERIODO,DIAS_PERIODO,DIAS_COMPESADOS,DIAS_DISFRUTADOS," +
            "DIAS_INCAPACIDAD,DIAS_PROPORCIONALES,DIAS_DISPONIBLES " +
            "FROM " + Entidades.Config.RRHH_View + " WHERE "+campo+" LIKE '%" + valor+"%'";


            OracleDataReader reader = oracleCommand.ExecuteReader();
            if (reader.HasRows)
            {
                List<Vista_Oracle> lista = new List<Vista_Oracle>();
                while (reader.Read())
                {
                    Vista_Oracle vacaciones = new Vista_Oracle();
                    try
                    {
                        vacaciones.cedula = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("CEDULA")));
                    }
                    catch
                    {
                        vacaciones.cedula = 0;
                    }
                    vacaciones.nombre = reader.GetOracleValue(reader.GetOrdinal("NOMBRE")).ToString();
                    if (vacaciones.nombre.ToUpper().Equals("NULL"))
                        vacaciones.nombre = "";

                    try
                    {
                        vacaciones.cod_direccion = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("COD_DIRECCION")));
                    }
                    catch
                    {
                        vacaciones.cod_direccion = 0;
                    }

                    vacaciones.nom_direccion = reader.GetOracleValue(reader.GetOrdinal("NOM_DIRECCION")).ToString();
                    if (vacaciones.nom_direccion.ToUpper().Equals("NULL"))
                        vacaciones.nom_direccion = "";


                    try
                    {
                        vacaciones.cod_cf = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("COD_CF")));
                    }
                    catch
                    {
                        vacaciones.cod_cf = 0;
                    }

                    //vacaciones.nom_cf=reader.GetOracleValue(reader.GetOrdinal("NOM_CF")).ToString();
                    // if(vacaciones.nom_cf.ToUpper().Equals("NULL"))
                    //     vacaciones.nom_cf="";

                    vacaciones.fecha_ingreso = reader.GetOracleValue(reader.GetOrdinal("FECHA_INGRESO")).ToString();
                    if (vacaciones.fecha_ingreso.ToUpper().Equals("NULL"))
                        vacaciones.fecha_ingreso = "";

                    try
                    {
                        vacaciones.periodo = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("PERIODO")));
                    }
                    catch
                    {
                        vacaciones.periodo = 0;
                    }

                    try
                    {
                        vacaciones.dias_periodo = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_PERIODO")));
                    }
                    catch
                    {
                        vacaciones.dias_periodo = 0;
                    }

                    try
                    {
                        vacaciones.dias_compensados = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_COMPESADOS")));
                    }
                    catch
                    {
                        vacaciones.dias_compensados = 0;
                    }

                    try
                    {
                        vacaciones.dias_disfrutados = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_DISFRUTADOS")));
                    }
                    catch
                    {
                        vacaciones.dias_disfrutados = 0;
                    }

                    try
                    {
                        vacaciones.dias_incapacidad = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_INCAPACIDAD")));
                    }
                    catch
                    {
                        vacaciones.dias_incapacidad = 0;
                    }

                    try
                    {
                        vacaciones.dias_proporcionales = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_PROPORCIONALES")));
                    }
                    catch
                    {
                        vacaciones.dias_proporcionales = 0;
                    }


                    try
                    {
                        vacaciones.dias_disponibles = Convert.ToInt32(reader.GetOracleValue(reader.GetOrdinal("DIAS_DISPONIBLES")));
                    }
                    catch
                    {
                        vacaciones.dias_disponibles = 0;
                    }

                    lista.Add(vacaciones);
                }
                return lista;
            }
            else
            {
                CloseConnection();
                return new List<Vista_Oracle>();
            }



        }

        //Nuevo procedimiento getDiasDisponibles recibe una cedula string   return array int
        public static int getDiasDisponibles(String cedula) {
            
                OpenConnection();
                OracleCommand oracleCommand = new OracleCommand();
                oracleCommand.Connection = oracleConnection;

                oracleCommand.CommandType = CommandType.Text;
                oracleCommand.CommandText = "SELECT SUM(DIAS_DISPONIBLES) TOTAL FROM " + Entidades.Config.RRHH_View + " WHERE CEDULA = '" + cedula+"'"; //Nombre el StoreProcedure

                //oracleCommand.Parameters.Add("TOTAL",).Direction = ParameterDirection.Output;
                Logger.fileWrite("SELECT SUM(DIAS_DISPONIBLES) TOTAL FROM " + Entidades.Config.RRHH_View + " WHERE CEDULA = '" + cedula+"'", Logger.MessageType.Information);

                OracleDataReader reader = oracleCommand.ExecuteReader();
                if (reader.HasRows)
                {

                    reader.Read();
                    int total = 0;
                    try
                    {
                        total = Convert.ToInt32(reader.GetValue(reader.GetOrdinal("TOTAL")));
                        Logger.fileWrite("Returned Value: "+total.ToString(), Logger.MessageType.Error);
                    }
                    catch (Exception e)
                    {
                        Logger.fileWrite("Failed to convert [" + reader.GetValue(reader.GetOrdinal("TOTAL")) + "]: "+e.Message , Logger.MessageType.Error);
                    }
                    CloseConnection();
                    return total;
                    
                }
                else
                {
                    Logger.fileWrite("No rows returned",Logger.MessageType.Error );
                    CloseConnection();
                    return 0;
                }


           
        }

        

    }
}
